﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CoVanHocTapData.Entities;
using CoVanHocTapData.Concretes;
using CoVanHocTapProject.Infrastructure;
using System.Web.Security;
using CoVanHocTapProject.Email;
using CoVanHocTapData.Entities.Emails;
using CoVanHocTapData.Interface;
using CoVanHocTapData.Infrastructure;
using System.Data;

namespace CoVanHocTapProject.Controllers
{
    public class TrangChuController : Controller
    {
        #region repos
        private ISinhVienRepository svRepos = new SinhVienRepository();
        private IMenuRepository menuRepos = new MenuRepository();
        #endregion

        //
        // GET: /TrangChu/
        static MonHocDangKy list = new MonHocDangKy();
        static List<SinhVien_TichLuyKhoi> DSSVTichLuyKhoiTheoMonHoc;
        IKetQuaHocRepository ketQuaHocRepos = new KetQuaHocRepository();
        IMonHocDangKyRepository mHocDangKyRepos = new MonHocDangKyRepository();
        
        public ActionResult Index()
        {
            
            //return View();
            string id = "504008";
            
            //kiem tra do kho mon hoc
            //kiem tra mon hoc tuong duong vs id

            List<string> svXetList = new List<string>();

            var dssv = ketQuaHocRepos.LayTatCaDSSVDauMH(id,"503","0");
            bool flagSV = false;
            int i = 0;
            foreach (var svItem in dssv)
            {
                if (i == 9)
                    break;
                if (svItem.MSSV.Equals("080003T") && !flagSV)
                {
                    flagSV = true;
                    svXetList.Add(svItem.MSSV);
                    continue;
                }
                if (!flagSV)
                    continue;
                else
                {
                    if (svXetList.IndexOf(svItem.MSSV) == -1)
                    {
                        svXetList.Add(svItem.MSSV);
                        i++;
                    }
                }
                
                
            }

            //svXetList.Add("080065T");
            //svXetList.Add("080066T");
            //svXetList.Add("080067T");
            //svXetList.Add("080068T");
            //svXetList.Add("080069T");
            //svXetList.Add("080070T");
            //svXetList.Add("080071T");
            //svXetList.Add("080073T");
            //svXetList.Add("080074T");
            //svXetList.Add("080079T");

            List<Test> resultList = new List<Test>();
            var monHocTuongDuongList = MonHocTuongDuongRepository.LayMonHocTuongDuong(id).Select(m => m.MonHocIDTuongDuong).ToList();

            //if (id == "504008" || id == "502017" || id == "503012" || id == "503013" || id == "503006" || id == "502003" || id == "502002" ||
            //    monHocTuongDuongList.IndexOf("504008") != -1 || monHocTuongDuongList.IndexOf("502017") != -1
            //    || monHocTuongDuongList.IndexOf("503012") != -1 || monHocTuongDuongList.IndexOf("503013") != -1
            //    || monHocTuongDuongList.IndexOf("503006") != -1 || monHocTuongDuongList.IndexOf("502003") != -1
            //    || monHocTuongDuongList.IndexOf("502002") != -1)
            //{
            foreach(var MSSV in svXetList)
            {
                Test result = new Test();
                result.DTBMon = ketQuaHocRepos.LayKetQuaHocTapTheoSVMonHoc(id, MSSV).ToList().LastOrDefault().DTB.Value;

                SinhVien SVDangNhap = svRepos.LaySVDangNhap(MSSV) ;
                //list = mHocDangKyRepos.LayMonHocDangKyKHHT(MSSV, Publics.hocKyHienTai.HocKyID);
                //int index = 0;
                //for (int i = 0; i < list.MonHocCTDT.Count; i++)
                //{
                //    if (list.MonHocCTDT[i].MonHocID.Equals(id))
                //    {
                //        index = i;
                //        break;
                //    }
                //}
                //if (list.MonHocCTDT[index].MonHocID.Equals(id))
                //{

                    DataTable table = new DataTable();
                    table.Columns.Add("MucDo");
                    table.Columns.Add("DTBTLTheoKhoi", typeof(double));
                    table.Columns.Add("DTBTLChung", typeof(double));
                    //training data.
                    //        if (DSSVTichLuyKhoiTheoMonHoc == null || DSSVTichLuyKhoiTheoMonHoc.Count == 0)
                    //     Publics.DSSVTichLuyKhoiTheoMonHoc = svtlKhoiRepos.LayDsSVTLTheoHocKy( Publics.hocKyHienTai.HocKyID).ToList();
                    {
                        #region do kho

                        //du lieu huan luyen dua vao mon hoc xet
                        //gia su mon hoc co ma mh la 504008
                        //lay lun nien khoa 2008 cho nhanh
                        IChiTietKhoiCTDTRepository chiTietKhoiCTDT = new ChiTietKhoiCTDTRepository();
                        ISinhVien_TichLuyKhoiRepository svtlTheoKhoiRepos = new SinhVien_TichLuyKhoiRepository();
                        ISinhVien_TichLuyRepository sv_TichLuyRepos = new SinhVien_TichLuyRepositpry();
                        IMonHocRepository monHocRepos = new MonHocRepository();
                        IMonHocTuongDuongRepository monHocTuongDuongRepos = new MonHocTuongDuongRepository();

                        var dsKhoiTheoMonHoc = chiTietKhoiCTDT.LayDsTheoKhoiCoSoTheoMaMonHoc(id, SVDangNhap.Lop.NganhID, 2008, SVDangNhap.Lop.HeDaoTaoID);
                        if (dsKhoiTheoMonHoc == null)
                        {

                            dsKhoiTheoMonHoc = chiTietKhoiCTDT.LayDsTheoKhoiCoSoTheoMaMonHoc(monHocTuongDuongList.FirstOrDefault(), SVDangNhap.Lop.NganhID, 2008, SVDangNhap.Lop.HeDaoTaoID);
                        }
                        DSSVTichLuyKhoiTheoMonHoc = svtlTheoKhoiRepos.LayDsSVTLTheoKhoi(dsKhoiTheoMonHoc.FirstOrDefault().KhoiChuongTrinhDaoTaoID, Publics.hocKyHienTai.HocKyID).ToList();

                        List<string> dsMonHocCungKhoi = new List<string>(); //ds mh cug khoi vs mon 504008

                        List<KetQuaHoc> dsKetQuaTheoKhoi = new List<KetQuaHoc>();
                        foreach (var chiTietKhoi in dsKhoiTheoMonHoc)
                        {
                            if (chiTietKhoi.MonHocID.Equals(id))
                                continue;
                            List<KetQuaHoc> dsKQDanhChoTuongDuong = new List<KetQuaHoc>();
                            KetQuaHoc KQTemp = ketQuaHocRepos.LayKetQuaHocTapCaoNhatTheoSVMonHoc(chiTietKhoi.MonHocID, SVDangNhap.MSSV);
                            dsKQDanhChoTuongDuong.Add(KQTemp);
                            if (KQTemp != null)
                            {
                                if (monHocTuongDuongRepos.KiemTraMonHocTuongDuong(chiTietKhoi.MonHocID))
                                {
                                    var dsMHTuongDuong = MonHocTuongDuongRepository.LayMonHocTuongDuong(chiTietKhoi.MonHocID);
                                    foreach (var tuongduongItem in dsMHTuongDuong)
                                    {
                                        dsKQDanhChoTuongDuong.Add(ketQuaHocRepos.LayKetQuaHocTapCaoNhatTheoSVMonHoc(tuongduongItem.MonHocID, SVDangNhap.MSSV));
                                    }
                                    KQTemp = ketQuaHocRepos.LayKetQuaCaoNhat(dsKQDanhChoTuongDuong);
                                }
                                dsKetQuaTheoKhoi.Add(KQTemp);
                                dsMonHocCungKhoi.Add(chiTietKhoi.MonHocID);
                            }
                            else
                            {
                                if (monHocTuongDuongRepos.KiemTraMonHocTuongDuong(chiTietKhoi.MonHocID))
                                {
                                    foreach (var tuongduongItem in MonHocTuongDuongRepository.LayMonHocTuongDuong(chiTietKhoi.MonHocID))
                                    {
                                        KQTemp = ketQuaHocRepos.LayKetQuaHocTapCaoNhatTheoSVMonHoc(tuongduongItem.MonHocIDTuongDuong, SVDangNhap.MSSV);
                                        if (KQTemp != null)
                                        {
                                            dsKetQuaTheoKhoi.Add(KQTemp);
                                            dsMonHocCungKhoi.Add(chiTietKhoi.MonHocID);
                                        }
                                    }
                                }
                            }
                        }
                        var dsKQSVDaTungHoc = ketQuaHocRepos.LayTatCaKetQuaMonDaHocKhongTrungCuaSinhVienTruMon(SVDangNhap,id);

                        //dtb theo khoi cua sv dang xet
                        float dtbTheoKhoi = ketQuaHocRepos.TinhDTBTichLuyTheoDsMH(dsKetQuaTheoKhoi); //tinh dtb theo khoi cua mon 504008

                        float dtbtl = 0;
                        if (sv_TichLuyRepos.KiemTraSinhVienTichLuy(SVDangNhap.MSSV, SVDangNhap.Lop.NganhID, SVDangNhap.Lop.HeDaoTaoID, Publics.hocKyHienTai.HocKyID))
                        {
                            dtbtl = float.Parse(sv_TichLuyRepos.LaySinhVienTichLuy(SVDangNhap.MSSV, SVDangNhap.Lop.NganhID, SVDangNhap.Lop.HeDaoTaoID, Publics.hocKyHienTai.HocKyID).FirstOrDefault().TrungBinhTichLuy.Value.ToString());
                        }
                        else
                        {
                            dtbtl = ketQuaHocRepos.TinhDTBTichLuy(SVDangNhap, SVDangNhap.Lop.NganhID, SVDangNhap.Lop.HeDaoTaoID);
                        }

                        result.DTBTL = dtbtl;
                        result.DTBKhoi = dtbTheoKhoi;

                        //dtb sv khoa truoc do
                        //ds sv theo khoi mon hoc
                        // var dsSVTLTheoKhoi = svtlTheoKhoiRepos.LayDsSVTLTheoKhoi(dsKhoiTheoMonHoc.FirstOrDefault().KhoiChuongTrinhDaoTaoID, HocKyID);
                        //if (dsSVTLTheoKhoi == null || dsSVTLTheoKhoi.Count()==0)
                        //{
                        //ds sv truoc 1 khoa va cug khoa vs sv va co hoc mon 504008
                        List<KetQuaHoc> dssvTruocKhoa = ketQuaHocRepos.LayDSSVTheoKhoaVaMonHoc(SVDangNhap.Lop.HeDaoTaoID, SVDangNhap.Lop.NganhID, SVDangNhap.Lop.NienKhoaID.Value, id);

                        //tinh dtbkhoi cua cac sv co hoc mon 504008
                        foreach (var svItem in dssvTruocKhoa)
                        {



                            float dtbTheoKhoiSV = 0; //dtb theo khoi
                            float tinChiTheoKhoiSV = 0;
                            float dtbtlChungSV = 0; //dtbtl cac mh cua sv dang xet
                            float tinChiTLSV = 0;
                            foreach (var monHocItem in dsMonHocCungKhoi)
                            {
                                KetQuaHoc kqHoc = ketQuaHocRepos.LayKetQuaHocTapCaoNhatTheoSVMonHoc(monHocItem, svItem.MSSV);
                                if (kqHoc != null)
                                {
                                    tinChiTheoKhoiSV += kqHoc.MonHoc.SoDVHocTap.Value;
                                    dtbTheoKhoiSV += kqHoc.DTB.Value * kqHoc.MonHoc.SoDVHocTap.Value;
                                }
                            }
                            if (tinChiTheoKhoiSV != 0)
                                dtbTheoKhoiSV = dtbTheoKhoiSV / tinChiTheoKhoiSV;
                            else
                                dtbTheoKhoiSV = 0;
                            int rotFlag = 0;
                            if (ketQuaHocRepos.LayKetQuaHocTapCaoNhatTheoSVMonHoc(id, svItem.MSSV).DTB.Value >= 5)
                                rotFlag = 1;
                            if (svtlTheoKhoiRepos.KiemTraTonTai(svItem.MSSV, dsKhoiTheoMonHoc.FirstOrDefault().KhoiChuongTrinhDaoTaoID, Publics.hocKyHienTai.HocKyID))
                            {
                                svtlTheoKhoiRepos.CapNhatDTBKhoiVaRotSinhVienTLKhoi(svItem.MSSV, dsKhoiTheoMonHoc.FirstOrDefault().KhoiChuongTrinhDaoTaoID, dtbTheoKhoiSV, Publics.hocKyHienTai.HocKyID, rotFlag);
                                continue;
                                //continue;
                            }

                            foreach (var monHocItem in dsKQSVDaTungHoc)
                            {
                                KetQuaHoc kqHoc = ketQuaHocRepos.LayKetQuaHocTapCaoNhatTheoSVMonHoc(monHocItem.MonHocID, svItem.MSSV);
                                if (kqHoc != null && kqHoc.DTB != null)
                                {
                                    tinChiTLSV += kqHoc.MonHoc.SoDVHocTap.Value;
                                    dtbtlChungSV += kqHoc.DTB.Value * kqHoc.MonHoc.SoDVHocTap.Value;
                                }
                            }
                            dtbtlChungSV = dtbtlChungSV / tinChiTLSV;

                            svtlTheoKhoiRepos.ThemSinhVienTLTheoKhoi(svItem.MSSV, dsKhoiTheoMonHoc.FirstOrDefault().KhoiChuongTrinhDaoTaoID, dtbTheoKhoiSV, Publics.hocKyHienTai.HocKyID, dtbtlChungSV, rotFlag);

                        }
                        DSSVTichLuyKhoiTheoMonHoc = svtlTheoKhoiRepos.LayDsSVTLTheoKhoi(dsKhoiTheoMonHoc.FirstOrDefault().KhoiChuongTrinhDaoTaoID, Publics.hocKyHienTai.HocKyID).ToList();
                        list.DTBTLTheoKhoiCuaSV = dtbTheoKhoi;
                        list.DTBTLChungCuaSV = dtbtl;
                        #endregion
                    }
                    if (DSSVTichLuyKhoiTheoMonHoc.Count > 0)
                    {
                        foreach (var svtlItem in DSSVTichLuyKhoiTheoMonHoc)
                        {
                            table.Rows.Add(svtlItem.Rot.Value.ToString(), Math.Truncate(svtlItem.DTBTichLuyTheoKhoi.Value), Math.Truncate(svtlItem.DTBTichLuyTheoSVXet.Value));
                        }
                        Classifier classifier = new Classifier();
                        classifier.TrainClassifier(table);
                        float DTBTLTheoKhoi = list.DTBTLTheoKhoiCuaSV;
                        float DTBTLChung = list.DTBTLChungCuaSV;
                        string rot = classifier.Classify(new float[] { float.Parse(Math.Truncate(DTBTLTheoKhoi).ToString()), float.Parse(Math.Truncate(DTBTLChung).ToString()) });
                        string tenMH = new MonHocRepository().LayMonHocTheoMaMH(id).TenMonHoc;

                        DTBTLTheoKhoi = float.Parse(Math.Round(DTBTLTheoKhoi, 2).ToString());
                        DTBTLChung = float.Parse(Math.Round(DTBTLChung, 2).ToString());

                        if (int.Parse(rot) == 0)
                        {

                            //rot = "<p style=\"color:lime\"><b>Thông báo:</b></p><br />Sinh viên <span style=\"color:lime\">" + SVDangNhap.MSSV + "</span> khó hoàn thành môn học \"" + tenMH + "\" vì sau khi thống kê, với:<br />   Điểm TBTL khối kiến thức có môn \"" + tenMH + "\" mà SV đang chọn là: <span style=\"color:lime\">" + DTBTLTheoKhoi + "</span><br />   Điểm TBTL chung của SV là: <span style=\"color:lime\">" + DTBTLChung + "</span><br /><br />Kết quả:<br />Những SV thoả các điều kiện trên, đa phần là <span style=\"color:lime\">rớt</span> môn học này!<br />Nếu đăng ký học thì sinh viên phải học thật nghiêm túc môn học này!";
                            result.DauRot = "Rot";
                        }
                        else
                        {
                            result.DauRot = "Dau";
                            //rot = "<p style=\"color:lime\"><b>Thông báo:</b></p><br />Sinh viên <span style=\"color:lime\">" + SVDangNhap.MSSV + "</span> có thể hoàn thành môn học \"" + tenMH + "\" vì sau khi thống kê, với:<br />   Điểm TBTL khối kiến thức có môn \"" + tenMH + "\" mà SV đang chọn là: <span style=\"color:lime\">" + DTBTLTheoKhoi + "</span><br />   Điểm TBTL chung của SV là: <span style=\"color:lime\">" + DTBTLChung + "</span><br /><br />Kết quả:<br />Những SV thoả các điều kiện trên, đa phần là <span style=\"color:lime\">hoàn thành</span> môn học này!<br />Nếu đăng ký học thì sinh viên cũng không được lơ là môn học này!";
                        }
                        //doKhoMonHoc = "$(document).ready(function showStickyErrorToast() { $().toastmessage('showToast', {text: ' " + rot + "',  sticky: true, position: 'middle-center', type: 'notice', closeText: '', close: function () {  console.log('');  } });});";
                        result.sv = SVDangNhap;
                        

                    }
                    //return View();
                //}
                    resultList.Add(result);
            }
            return View(resultList);
        }


        public ActionResult VerticalMenu()
        {
            return View();
        }


        public ActionResult DangNhap()
        {
            return View();
        }

        [HttpPost]
        public ActionResult DangNhap(FormCollection model)
        {
            
            var login = Request.Params.AllKeys.FirstOrDefault(key => key.Equals("subDangNhap"));
            if (login != null)
            {
                string strTenDangNhap = model["txtTenDangNhap"];
                string strMatKhau = model["txtMatKhau"];
                if (!String.IsNullOrEmpty(strTenDangNhap) && !String.IsNullOrEmpty(strMatKhau))
                {
                    SinhVien svDN = svRepos.LaySVDangNhap(strTenDangNhap);
                    if (svDN == null)
                    {
                        return View(false);
                        //throw new Exception(Publics.ClientMessageBox("MSSV hoặc mật khẩu sai"));
                    }
                    else if (svDN != null && svDN.MatKhau != CoVanHocTapData.Infrastructure.EncryptPassword.encryptString(strMatKhau))
                    //throw new Exception(Publics.ClientMessageBox("Sai mật khẩu"));
                    {
                        //ViewData["ViewErrorDangNhap"] = "Sai tên đăng nhập hoặc mật khẩu!";
                        return View(false);
                    }
                    Publics.sinhVienDangNhap = svDN;
                    //return DangNhapThanhCong();
                    Response.Redirect("/TrangChu");
                    //return View();
                    //return RedirectToAction("Index","TrangChu");
                }
            }
            return View(Publics.sinhVienDangNhap);
            //return View();
        }

        public ActionResult DangNhapThanhCong()
        {
            //Response.Redirect("/TrangChu/Index");
            
            return View(Publics.sinhVienDangNhap);
            //return RedirectToAction("DangNhap", "TrangChu");
            //return View(Publics.sinhVienDangNhap);
        }

        public ActionResult XemThongTinCaNhan()
        {
            return View();
        }

        public ActionResult DoiMatKhau()
        {
            return View();
        }
        [HttpPost]
        public ActionResult DoiMatKhau(FormCollection form)
        {
            var login = Request.Params.AllKeys.FirstOrDefault(key => key.Equals("resetPass"));
            if (login != null)
            {
                string mkHT = form["oldPass"];
                string mkMoi = form["newPass"];
                string mkmoi2 = form["newPass2"];

                if (EncryptPassword.encryptString(mkHT) != Publics.sinhVienDangNhap.MatKhau)
                {
                    return View(ViewData["alert('Mật khẩu cũ nhập sai')"]);
                }
                if (!mkMoi.Equals(mkmoi2))
                {
                    ViewData["ThongBaoLoi"] = "alert('Nhập mật khẩu mới và gõ lại mật khẩu mới không giống nhau')";
                    return View(ViewData["ThongBaoLoi"]);
                }
                if (EncryptPassword.encryptString(mkMoi) == Publics.sinhVienDangNhap.MatKhau || mkMoi.Length < 6)
                {
                    ViewData["ThongBaoLoi"] = "alert('Mật khẩu mới không hợp lệ, yêu cầu dài tối thiểu 6 ký tự và không được trùng với mật khẩu cũ.')";
                    return View(ViewData["ThongBaoLoi"]);
                }

                svRepos.UpdateMatKhauChoSV(Publics.sinhVienDangNhap, EncryptPassword.encryptString(mkMoi));
                Publics.sinhVienDangNhap = null;
                ViewData["ThongBaoLoi"] = "alert('Đã thay đổi mật khẩu thành công. Sinh viên hãy đăng nhập lại!')";
                return View(ViewData["ThongBaoLoi"]);
            }
            return View();
        }

        public ActionResult Thoat()
        {
            Publics.Logout();
            return RedirectToAction("Index", "TrangChu");
        }

        public ActionResult QuenMatKhau()
        {
            return View();
            
        }

        [HttpPost]
        public ActionResult QuenMatKhau(FormCollection form)
        {
            string mssv = form["MSSVInput"];
            SinhVien sv = svRepos.LaySVDangNhap(mssv);
            if (sv == null)
            {
                ViewData["LoiMSSV"] = "* Sai mã số sinh viên";
                return View(ViewData["LoiMSSV"]);
            }
            
            string newPass = "123456";
            ControllerContext controllerContext = this.ControllerContext;
            EmailMVCService emailService = new EmailMVCService();
            ForgetPasswordEmailModel model = new ForgetPasswordEmailModel
            {
                To = sv.Email,
                NewPassword = newPass,
                sv = sv
            };
            emailService.SendEmail(controllerContext, "MVCForgetPassword", model,sv.Email, "Cố vấn học tập trường ĐH Tôn Đức Thắng - Mật khẩu mới");
            //sv.MatKhau = CoVanHocTapData.Infrastructure.EncryptPassword.encryptString(newPass);
            svRepos.UpdateMatKhauChoSV(sv, EncryptPassword.encryptString(newPass));
            return RedirectToAction("GuiEmailThanhCong");
        }

        public ActionResult GuiEmailThanhCong()
        {
            return View();
        }
    }
}
